
/**
 @file Command.h
 @brief Definición de la clase comando.
 @date   7/12/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef COMMAND_H_
#define COMMAND_H_

#include <list>
#include "Message.h"
//#include "MessageIO.h"
#include <cliMsgDef.h>

using namespace std;

/**@brief Representa un comando enviado por el usuario y contiene sus argumentos. @see Message */
class Command: public Message {

    list<uint8_t> _byte_args; //!< Contenedor de los argumentos enteros de 8 bits.
    list<short int> _short_args; //!< Contenedor de los argumentos enteros de 16 bits.
    list<int> _int_args; //!< Contenedor de los argumentos enteros.
    list<float> _float_args; //!< Contenedor de los argumentos flotantes.
    list<double> _dbl_args; //!< Contenedor de los argumentos flotantes de doble precisión
    list<node_t> _destination_list; //!< Lista de destinatarios para multicast. @see node_t

public:

    Command();

    virtual ~Command();

    /**
      * @brief Obtiene la lista de argumentos enteros de 8 bits
      * @return Copia de la lista de argumentos enteros de 8 bits
      */
    list<uint8_t> getByteArgs();

    /**
      * @brief Asigna la lista de argumentos enteros de 8 bits
      * @param lista de enteros de 8 bits
      */
    void setByteArgs(list<uint8_t> byteArgs);

    /**
      * @brief Obtiene la lista de argumentos flotantes de doble precisión
      * @return Copia de la lista de argumentos flotantes de doble precisión
      */
    list<double> getDblArgs();

    /**
      * @brief Asigna la lista de argumentos flotantes de doble precisión
      * @param lista de flotantes de doble precisión
      */
    void setDblArgs(list<double> dblArgs);

    /**
      * @brief Obtiene la lista de argumentos flotantes
      * @return Copia de la lista de argumentos flotantes
      */
    list<float> getFloatArgs();

    /**
      * @brief Asigna la lista de argumentos flotantes
      * @param lista de flotantes
      */
    void setFloatArgs(list<float> floatArgs);

    /**
      * @brief Obtiene la lista de argumentos enteros
      * @return Copia de la lista de argumentos enteros
      */
    list<int> getIntArgs();

    /**
      * @brief Asigna la lista de argumentos enteros
      * @param lista de enteros
      */
    void setIntArgs(list<int> intArgs);

    /**
      * @brief Obtiene la lista de argumentos enteros de 16 bits
      * @return Copia de la lista de argumentos enteros de 16 bits
      */
    list<short int> getShortArgs();

    /**
      * @brief Asigna la lista de argumentos enteros de 16 bits
      * @param lista de enteros de 16 bits
      */
    void setShortArgs(list<short int> shortArgs);

    /**
      * @brief Obtiene la lista de destinatarios del comando
      * @return Copia de la lista de argumentos enteros de 16 bits
      */
    list<node_t> getDestinationList();

    /**
      * @brief Asigna la lista de destinatarios del comando
      * @param lista de identificadores. @see node_t
      */
    void setDestinationList(list<node_t> destinationList);

    /**
      * @brief Agrega un elemento a la lista de argumentos enteros de 8 bits
      */
    void addByte (uint8_t val);

    /**
      * @brief Agrega un elemento a la lista de argumentos enteros de 16 bits
      */
    void addShort (short int val);

    /**
      * @brief Agrega un elemento a la lista de argumentos enteros
      */
    void addInt (int val);

    /**
      * @brief Agrega un elemento a la lista de argumentos flotantes
      */
    void addFloat (float val);

    /**
      * @brief Agrega un elemento a la lista de argumentos flotantes de doble precisión
      */
    void addDouble (double val);

    /**
      * @brief Convierte el comando en un mensaje de capa aplicación para su envío.
      * @return Apuntador a la instancia del comando convertido en su superclase Message. @see Message
      */
    Message* toMessage();

};

#endif /* COMMAND_H_ */
